【293期】京东一面:子线程如何获取父线程 ThreadLocal 值?
点击上方“Java精选”,选择“设为星标”
别问别人为什么,多问自己凭什么!
下方有惊喜,留言必回,有问必答!
每一天进步一点点,是成功的开始...
想要子线程获取父线程中 ThreadLocal 中的值,需要其子类 InheritableThreadLocal 实现。
测试代码如下:
public static void main(String[] args) throws InterruptedException {
Thread parentParent = new Thread(() -> {
ThreadLocal<Integer> threadLocal = new ThreadLocal<>();
threadLocal.set(1);
InheritableThreadLocal<Integer> inheritableThreadLocal = new InheritableThreadLocal<>();
inheritableThreadLocal.set(2);
new Thread(() -> {
System.out.println("threadLocal=" + threadLocal.get());
System.out.println("inheritableThreadLocal=" + inheritableThreadLocal.get());
}).start();
}, "父线程");
parentParent.start();
}
运行结果如下:
原理如下:
首先我们要知道 Thread类维护了两个ThreadLocalMap
跟进 new Thread() 方法
其构造方法调用了init方法, init方法把inheritThreadLocals值设置为了true
继续跟进。
当inheritThreadLocals的值为true并且其父线程的inheritableThreadLocals不为null时, 把其父线程inheritableThreadLocals 赋值给当前线程的inheritableThreadLocals
这就是子线程可以获取到父线程ThreadLocal值的关键。另外,更多面试题资料,公众号Java精选,回复java面试,获取最新面试题资料,同时支持随时随地刷题。
继续跟进 看看 InheritableThreadLocal 的get() 方法
get()方法没什么好看的,就是ThreadLocal的get()方法。
注意:InheritableThreadLocal 对ThreadLocal 的getMap()方法进行重写
ThreadLocalMap getMap(Thread t) {
//获取线程自己的变量threadLocals,并绑定到当前调用线程的成员变量threadLocals上
return t.threadLocals;
}
void createMap(Thread t, T firstValue) {
t.threadLocals = new ThreadLocalMap(this, firstValue);
//创建给ThreadLocalMap的table属性赋值,并且将firstValue放在数组首位。
}
createMap方法不仅创建了threadLocals,同时也将要添加的本地变量值添加到了threadLocals中。
InheritableThreadLocal类继承了ThreadLocal类,并重写了childValue、getMap、createMap方法。
其中createMap方法在被调用的时候,创建的是inheritableThreadLocal而不是threadLocals。
同理,getMap方法在当前调用者线程调用get方法的时候返回的也不是threadLocals而是inheritableThreadLocal。
作者:_Louie
https://blog.csdn.net/weixin_44912855/article/details/123477206
公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!
3000+ 道面试题在线刷,最新、最全 Java 面试题!
【285期】JDK9 为何要将 String 的底层实现由 char[] 改成了 byte[]?
【286期】领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解)
【287期】5 款免费又好用的 Docker 管理神器!酷炫到没朋友!
【288期】面试官问:如何解决打开 IDEA 对 CPU 占用率超高的问题?
【289期】Java 8 新特性:Comparator.naturalOrder | 自然排序
最近有很多人问,有没有读者交流群!想知道如何加入?方式很简单,兴趣相投的朋友,只需要点击下方卡片,回复“加群”,即可无套路入交流群!